package org.osforce.platform.vo;

import java.util.Collections;
import java.util.List;

import org.apache.commons.lang.StringUtils;

/**
 * 与具体分页技术无关的分页类
 * 
 * @author gavin
 * 
 */
public class Page<T>{
	// 排序 //
	public static final String ASC="asc";
	public static final String DESC="desc";

	// 分页参数 //
	protected int pageNo=1;
	protected int pageSize=1;
	protected String orderBy=null;
	protected String order=null;
	protected boolean autoCount=true;

	// 返回结果 //
	protected List<T> result=Collections.emptyList();
	protected Long totalCount=-1L;

	public Page(){
	}

	public Page(final int pageSize){
		setPageSize(pageSize);
	}

	public Page(final int pageSize,final Boolean autoCount){
		setPageSize(pageSize);
		setAutoCount(autoCount);
	}

	public int getPageNo(){
		return pageNo;
	}

	public void setPageNo(int pageNo){
		// pageNo 小于 1 时 自动调整为 1
		this.pageNo=pageNo<1?1:pageNo;
	}

	public int getPageSize(){
		return pageSize;
	}

	public void setPageSize(int pageSize){
		// pageSize 小于 1 时 自动调整为 1
		this.pageSize=pageSize<1?1:pageSize;
	}

	public int getFirst(){
		return ((pageNo-1)*pageSize)+1;
	}

	/**
	 * 获得排序字段,无默认值.多个排序字段时用','分隔.
	 */
	public String getOrderBy(){
		return orderBy;
	}

	/**
	 * 设置排序字段,多个排序字段时用','分隔.
	 */
	public void setOrderBy(final String orderBy){
		this.orderBy=orderBy;
	}

	/**
	 * 是否已设置排序字段,无默认值.
	 */
	public Boolean isOrderBySetted(){
		return(StringUtils.isNotBlank(orderBy)&&StringUtils.isNotBlank(order));
	}

	/**
	 * 获得排序方向.
	 */
	public String getOrder(){
		return order;
	}

	/**
	 * 设置排序方式向.
	 * 
	 * @param order
	 *            可选值为desc或asc,多个排序字段时用','分隔.
	 */
	public void setOrder(final String order){
		// 检查order字符串的合法值
		String[] orders=StringUtils.split(StringUtils.lowerCase(order),',');
		for(String orderStr:orders){
			if(!StringUtils.equals(DESC,orderStr)
					&&!StringUtils.equals(ASC,orderStr))
				throw new IllegalArgumentException("排序方向"+orderStr+"不是合法值");
		}
		this.order=StringUtils.lowerCase(order);
	}

	/**
	 * 查询对象时是否自动另外执行count查询获取总记录数, 默认为false.
	 */
	public boolean isAutoCount(){
		return autoCount;
	}

	/**
	 * 查询对象时是否自动另外执行count查询获取总记录数.
	 */
	public void setAutoCount(final boolean autoCount){
		this.autoCount=autoCount;
	}

	// 访问查询结果函数 //

	/**
	 * 取得页内的记录列表.
	 */
	public List<T> getResult(){
		return result;
	}

	public void setResult(final List<T> result){
		this.result=result;
	}

	/**
	 * 取得总记录数, 默认值为-1.
	 */
	public long getTotalCount(){
		return totalCount;
	}

	public void setTotalCount(final long totalCount){
		this.totalCount=totalCount;
	}

	/**
	 * 根据pageSize与totalCount计算总页数, 默认值为-1.
	 */
	public Long getTotalPages(){
		if(totalCount<0)
			return -1L;

		Long count=totalCount/pageSize;
		if(totalCount%pageSize>0){
			count++;
		}
		return count;
	}

	/**
	 * 是否还有下一页.
	 */
	public Boolean isHasNext(){
		return(pageNo+1<=getTotalPages());
	}

	/**
	 * 取得下页的页号, 序号从1开始. 当前页为尾页时仍返回尾页序号.
	 */
	public int getNextPage(){
		if(isHasNext())
			return pageNo+1;
		else
			return pageNo;
	}

	/**
	 * 是否还有上一页.
	 */
	public Boolean isHasPre(){
		return(pageNo-1>=1);
	}

	/**
	 * 取得上页的页号, 序号从1开始. 当前页为首页时返回首页序号.
	 */
	public int getPrePage(){
		if(isHasPre())
			return pageNo-1;
		else
			return pageNo;
	}

}
